#创建了一个class的实例后，我们可以给该实例绑定任何属性和方法
class Student(object):
    pass

#给实例绑定属性
s=Student()
s.name='Mike'

#给实例绑定的方法
def set_age(self,age):
    self.age=age

from types import  MethodType
s.set_age=MethodType(set_age,s)#给实例绑定方法
s.set_age(24)
print(s.age)

#但是给实例绑定的方法对另外一个实例是不起作用的
#为了给所有实例都绑定方法，可以给class绑定方法：
def set_Score(self,score):
    self.score=score
Student.set_score=set_Score

s.set_score(123)
print(s.score)
# 上面的set_score方法可以直接定义在class中
# ，但动态绑定允许我们在程序运行的过程中动态给
# class加上功能

#使用__slots__
#为了达到限制的目的，Python允许在定义class的时候，
# 定义一个特殊的__slots__变量，来限制该class实例能添
# 加的属性：
class StudentX(object):
    __slots__ = ('name','age')#用tuple定义允许绑定的属性名称

us=StudentX()
us.name="1ush"
us.age="123"
try:
    us.score=100
except:
    print("属性被限制了")
print(us.name,us.age)


#使用__slots__要注意，__slots__定义的属性仅对当前类实例起作用
# ，对继承的子类是不起作用的：
class person(StudentX):
    pass

test=person()
test.score=100
print(test.score)

class person1(StudentX):
    __slots__ = ('name','age')
    pass

test=person1()
try:
    test.score=100
except:
    print("子类也加了限制，不能在绑定属性了")





